home *** CD-ROM | disk | FTP | other *** search
/ Magnum One / Magnum One (Mid-American Digital) (Disc Manufacturing).iso / d12 / v8n13.arc / WINDOWS.C < prev   
Text File  |  1989-06-10  |  2KB  |  104 lines

  1.  
  2. #define MAX_WINDOWS 10
  3. #define BUFFER_SIZE 10000
  4.  
  5. typedef unsigned char BYTE;
  6.  
  7. struct WindowData{
  8.     BYTE Row;
  9.     BYTE Col;
  10.     BYTE Height;
  11.     BYTE Width;
  12. } WinData[MAX_WINDOWS];
  13.  
  14. int WinNum = -1;                    /* Index into WinData array */
  15. unsigned ScreenCols;                /* Number of columns displayed */
  16. unsigned far *VideoSeg;                /* Pointer to video segment */
  17. unsigned BufferPtr = 0;                /* Buffer index */
  18. unsigned WinBuffer[BUFFER_SIZE];    /* Buffer for saved screen data */
  19.  
  20. main()    /* Illustrates the use of window functions */
  21. {
  22.     InitWindow();
  23.  
  24.     if (PushWindow(0, 0, 8, 40)) {
  25.         printf("Overflow error\n");
  26.         exit(1);
  27.     }
  28.  
  29.     /*---------------------------------------*/
  30.     /* Insert code to fill first window here */
  31.     /*---------------------------------------*/
  32.  
  33.     if (PushWindow(10, 15, 10, 50)) {
  34.         printf("Overflow error\n");
  35.         exit(1);
  36.     }
  37.  
  38.     /*----------------------------------------*/
  39.     /* Insert code to fill second window here */
  40.     /*----------------------------------------*/
  41.  
  42.     if (PopWindow()) {
  43.         printf("Underflow error\n");
  44.         exit(1);
  45.     }
  46.  
  47.     if (PopWindow()) {
  48.         printf("Underflow error\n");
  49.         exit(1);
  50.     }
  51. }
  52.  
  53. InitWindow(void)
  54. {
  55.     if (*(unsigned far *) 0x00400063 == 0x3B4)
  56.         VideoSeg = (unsigned far *) 0xB0000000;
  57.     else
  58.         VideoSeg = (unsigned far *) 0xB8000000;
  59.     ScreenCols = *(unsigned far *) 0x0040004A;
  60. }
  61.  
  62. PushWindow(BYTE Row, BYTE Col, BYTE Height, BYTE Width)
  63. {
  64.     unsigned Offset;
  65.     BYTE i, j;
  66.  
  67.     if (WinNum == 9)        /* Check for overflow */
  68.         return(1);
  69.     if ((BufferPtr + Height * Width) > BUFFER_SIZE)
  70.         return(2);
  71.  
  72.     WinData[++WinNum].Row = Row;    /* Save window parameters */
  73.     WinData[WinNum].Col = Col;
  74.     WinData[WinNum].Height = Height;
  75.     WinData[WinNum].Width = Width;
  76.  
  77.     Offset = (Row * ScreenCols) + Col;
  78.     for (i=0; i<Height; i++)
  79.         for (j=0; j<Width; j++)
  80.             WinBuffer[BufferPtr++] = *(VideoSeg + Offset + 
  81.                                         (i*ScreenCols) + j);
  82.  
  83.     return(0);
  84. }
  85.  
  86. PopWindow(void)
  87. {
  88.     unsigned Offset;
  89.     int i, j;
  90.  
  91.     if (WinNum == -1)        /* Check for undeflow */
  92.         return(1);
  93.  
  94.     Offset = (WinData[WinNum].Row * ScreenCols) + WinData[WinNum].Col;
  95.     for (i=WinData[WinNum].Height-1; i>-1; i--)
  96.         for (j=WinData[WinNum].Width-1; j>-1; j--)
  97.             *(VideoSeg + Offset + (i*ScreenCols) + j) = 
  98.                 WinBuffer[--BufferPtr];
  99.  
  100.     WinNum--;
  101.     return(0);
  102. }
  103.  
  104.